# 反射 reflect
# 反射就是通过字符串的形式，导入模块；通过字符串的形式，去模块寻找指定函数，并执行。利用字符串的形式去对象（模块）中操作（查找/获取/删除/添加）成员，一种基于字符串的事件驱动！
# python 里的反射有下面四种方法
# hasattr(obj,name_str)：判断一个对象 obj 里是否有对应的 name_str 字符串的方法
# getattr(obj,name_str)：根据字符串去获取 obj 对象里的对应方法的内存地址
# setattr(obj,"y",z)：相当于 obj.y=z
# delattr(obj,name_str)：删除属性
# 可以反射的对象
# 1.反射类中的变量：静态属性，类方法，静态方法
# 2.反射对象中的变量，对象属性，普通方法
# 3.反射模块中的变量
# 4.反射文本中的变量
class Teacher(object):
    age = 30

    def __init__(self, name, course):
        self.name = name
        self.course = course

    def teach(self):
        print(self.name + '上' + self.course)

    def assign_homework(self):
        print(self.name + '老师' + '布置了' + self.course + '课后作业')

    @classmethod
    def have_examination(cls):
        print(cls.course + '测验考试')


# 获取类属性
print(getattr(Teacher, 'age'))
# 获取类方法
getattr(Teacher, 'have_examination')

t = Teacher('张三', '物理')
print(getattr(t, 'name'))
